/**
 * 给定N个点，求所有过原点的直线能够覆盖的最多点的数量。
 * 过原点的直线显然可以按照一对互质的整数来划分
 * 为了保险，可以先计算出象限，再用整数取求gcd。
 * 其实用一对整数做哈希就行
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;

int f(llt x, llt y){
    if(0 == y) return 0;    
    if(y < 0) y = -y, x = -x;
    if(x >= 0) return 1;
    return 2;
}

bool g(const pair<llt, llt> & a, const pair<llt, llt> & b){
    int aloc = f(a.first, a.second);
    int bloc = f(b.first, b.second);
    if(aloc != bloc) return aloc < bloc;
    auto tmp = a.first * b.second - b.first * a.second;
    return tmp > 0;    
}

int N;
using MapType = map<pair<llt, llt>, int, function<bool(const pair<llt, llt> &, const pair<llt, llt> &)>>;

array<MapType, 3> Map {MapType(g), MapType(g), MapType(g)};


void work(){
    cin >> N;
    int zcnt = 0;
    for(int x,y,i=0;i<N;++i){
        cin >> x >> y;
        if(x or y) {
            int loc = f(x, y);
            auto & mm = Map[loc];
            auto xx = x;
            auto yy = y;
            if(xx < 0) xx = -xx;
            if(yy < 0) yy = -yy;
            auto g = __gcd(xx, yy);
            xx /= g, yy /= g;
            mm[{xx, yy}] += 1;
        }else{
            ++zcnt;
        }
    }
    int ans = 0;
    for(const auto & mm : Map){
        for(const auto & p : mm){
            ans = max(ans, p.second);
        }
    }
    cout << ans + zcnt << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}
